/**
 * 代码生成协议
 * 
 * 该协议定义了低代码平台的代码生成规范，包括代码生成器接口、模板系统和输出格式。
 */

import type { App, Model, Page } from '@/types';

/**
 * 代码生成配置
 */
export interface GenerationOptions {
  // 目标技术栈
  framework: 'react' | 'vue' | 'angular';
  language: 'javascript' | 'typescript';
  cssProcessor: 'css' | 'scss' | 'less' | 'styled-components' | 'emotion';
  
  // 项目配置
  projectName: string;
  version: string;
  description?: string;
  author?: string;
  license?: string;
  
  // 代码风格
  styleGuide: 'airbnb' | 'google' | 'standard';
  tabWidth: 2 | 4;
  useSemicolons: boolean;
  useSingleQuotes: boolean;
  trailingComma: 'none' | 'es5' | 'all';
  
  // 痕迹处理
  removeLowcodeTraces: boolean;
  addComments: boolean;
  addCredits: boolean;
  
  // 依赖管理
  packageManager: 'npm' | 'yarn' | 'pnpm';
  includeDependencies: boolean;
  
  // 状态管理
  stateManagement: 'none' | 'redux' | 'mobx' | 'zustand' | 'recoil';
  
  // 路由
  routing: 'none' | 'react-router' | 'vue-router' | 'angular-router';
}

/**
 * 文件生成结果
 */
export interface GeneratedFile {
  path: string;           // 文件路径
  content: string;        // 文件内容
  type: 'component' | 'page' | 'model' | 'config' | 'style' | 'other'; // 文件类型
}

/**
 * 代码转换器
 * 将低代码模型转换为真实代码的接口
 */
export interface CodeTransformer {
  // 转换组件
  transformComponent: (component: unknown, options: GenerationOptions) => string;
  
  // 转换页面
  transformPage: (page: Page, options: GenerationOptions) => string;
  
  // 转换数据模型
  transformModel: (model: Model, options: GenerationOptions) => string;
  
  // 生成主入口文件
  generateEntryFile: (app: App, options: GenerationOptions) => string;
  
  // 生成配置文件
  generateConfigFiles: (app: App, options: GenerationOptions) => Record<string, string>;
}

/**
 * 依赖分析结果
 */
export interface DependencyAnalysis {
  dependencies: Record<string, string>;    // 生产依赖
  devDependencies: Record<string, string>; // 开发依赖
}

/**
 * 代码生成结果
 */
export interface GenerationResult {
  files: GeneratedFile[];        // 生成的文件
  dependencies: DependencyAnalysis; // 依赖分析
  stats: {
    componentCount: number;      // 组件数量
    pageCount: number;           // 页面数量
    modelCount: number;          // 模型数量
    fileCount: number;           // 文件总数
    totalLinesOfCode: number;    // 代码总行数
  };
}

/**
 * 代码模板接口
 */
export interface CodeTemplate {
  id: string;                 // 模板ID
  name: string;               // 模板名称
  description: string;        // 模板描述
  tags: string[];             // 标签
  framework: string;          // 目标框架
  preview?: string;           // 预览图URL
  getTemplate: (type: string, data: Record<string, unknown>) => string; // 获取模板方法
}

/**
 * 代码生成器接口
 */
export interface CodeGenerator {
  // 生成完整项目
  generateProject: (app: App, options: GenerationOptions) => Promise<GenerationResult>;
  
  // 生成单个页面
  generatePage: (page: Page, options: GenerationOptions) => Promise<GeneratedFile[]>;
  
  // 生成数据模型相关代码
  generateModels: (models: Model[], options: GenerationOptions) => Promise<GeneratedFile[]>;
  
  // 分析项目依赖
  analyzeDependencies: (app: App, options: GenerationOptions) => Promise<DependencyAnalysis>;
}

/**
 * 代码痕迹清除策略
 */
export interface TraceRemovalStrategy {
  // 变量重命名策略
  renameVariables: boolean;  
  renameStrategy: 'semantic' | 'random' | 'hybrid';
  
  // 注释处理
  removeInternalComments: boolean;
  addNaturalComments: boolean;
  
  // 布局处理
  randomizeIndentation: boolean;
  randomizeLineBreaks: boolean;
  
  // 命名约定
  namingConvention: 'camelCase' | 'PascalCase' | 'snake_case' | 'mixed';
}

/**
 * 项目结构
 */
export interface ProjectStructure {
  // 目录结构
  structure: {
    src: {
      components: boolean;
      pages: boolean;
      models?: boolean;
      services?: boolean;
      utils?: boolean;
      styles?: boolean;
      hooks?: boolean;
      contexts?: boolean;
    };
    public: boolean;
    tests?: boolean;
  };
  
  // 文件命名规则
  fileNaming: 'kebab-case' | 'camelCase' | 'PascalCase';
  
  // 扩展名规则
  extensions: {
    components: string;   // 如：'.tsx', '.jsx', '.vue'
    styles: string;       // 如：'.scss', '.css', '.less'
    configs: string;      // 如：'.js', '.ts'
  };
}

/**
 * 导出格式
 */
export interface ExportFormat {
  type: 'zip' | 'folder' | 'github';  // 导出类型
  options?: {
    compressionLevel?: number;         // zip压缩级别(1-9)
    includeNodeModules?: boolean;      // 是否包含node_modules
    githubRepo?: string;               // GitHub仓库地址
    githubToken?: string;              // GitHub访问令牌
  };
} 